import logging
import os
from datetime import datetime
import sys

# 定义日志级别
LOG_LEVEL = logging.INFO

# 定义日志格式
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

# 日志目录
LOG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'logs')

# 确保日志目录存在
os.makedirs(LOG_DIR, exist_ok=True)

# 创建日志记录器
logger = logging.getLogger('vulnerability_scanner')
logger.setLevel(LOG_LEVEL)

# 移除已存在的处理器
for handler in logger.handlers[:]:
    logger.removeHandler(handler)

# 创建控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(LOG_LEVEL)
console_formatter = logging.Formatter(LOG_FORMAT)
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)

# 创建文件处理器（按天滚动）
log_file = os.path.join(LOG_DIR, f"scanner_{datetime.now().strftime('%Y-%m-%d')}.log")
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.DEBUG)  # 文件日志记录更详细的信息
file_formatter = logging.Formatter(LOG_FORMAT)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)

def setup_logger(name=None, log_level=None):
    """创建或配置日志记录器"""
    # 如果指定了名称，则创建新的日志记录器
    if name:
        new_logger = logging.getLogger(name)
        new_logger.setLevel(log_level or LOG_LEVEL)
        
        # 移除已存在的处理器
        for handler in new_logger.handlers[:]:
            new_logger.removeHandler(handler)
        
        # 添加控制台处理器
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(log_level or LOG_LEVEL)
        console_formatter = logging.Formatter(LOG_FORMAT)
        console_handler.setFormatter(console_formatter)
        new_logger.addHandler(console_handler)
        
        # 添加文件处理器
        file_handler = logging.FileHandler(log_file, encoding='utf-8')
        file_handler.setLevel(logging.DEBUG)
        file_formatter = logging.Formatter(LOG_FORMAT)
        file_handler.setFormatter(file_formatter)
        new_logger.addHandler(file_handler)
        
        return new_logger
    
    # 否则返回默认日志记录器
    return logger

def set_log_level(level):
    """设置日志级别"""
    global LOG_LEVEL
    LOG_LEVEL = level
    logger.setLevel(level)
    
    # 更新所有处理器的日志级别
    for handler in logger.handlers:
        if isinstance(handler, logging.StreamHandler):
            handler.setLevel(level)


def log_exception(exc, message="Exception occurred"):
    """记录异常信息"""
    logger.error(message, exc_info=exc)


def log_debug(message):
    """记录调试信息"""
    logger.debug(message)

def log_info(message):
    """记录一般信息"""
    logger.info(message)

def log_warning(message):
    """记录警告信息"""
    logger.warning(message)

def log_error(message):
    """记录错误信息"""
    logger.error(message)

def log_critical(message):
    """记录严重错误信息"""
    logger.critical(message)

# 导出常用日志函数
log = {
    'debug': log_debug,
    'info': log_info,
    'warning': log_warning,
    'error': log_error,
    'critical': log_critical,
    'exception': log_exception
}